/*
    需求: 实现基本的话题通信，一方发布数据，一方接收数据，
         实现的关键点:
         1.发送方
         2.接收方
         3.数据(此处为普通文本)


    消息订阅方:
        订阅话题并打印接收到的消息

    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 订阅者 对象
        5.处理订阅的消息(回调函数)
        6.设置循环调用回调函数

*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("我听见:%s",msg_p->data.c_str());
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}
int main(int argc, char  *argv[]){
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"listener");//2.初始化 ROS 节点:命名(唯一)
    ros::NodeHandle nh("hello");//3.实例化 ROS 句柄
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);//4.实例化 订阅者 对象
/**/
	while(ros::ok()){
		ros::spinOnce();	//ros::spinOnce()+while循环相当于ros::spin()，spinOnce()被调用后还可以继续执行之后的程序
		//ROS_INFO("ros::spinOnce看看能不能输出");  //实验后可以输出
	}

    //ros::spin(); //循环调用回调函数，主程序到这儿就不往下执行了
	//ROS_INFO("ros::spin看看能不能输出"); //实验后不能输出
    return 0;
}



/*
	订阅时，第一条数据丢失
	原因: 发送第一条数据时， publisher 还未在 roscore 注册完毕
	解决: 注册后，加入休眠 ros::Duration(3.0).sleep(); 延迟第一条数据的发送
*/

